home *** CD-ROM | disk | FTP | other *** search
/ Free Software Collection: Marty 1 / FM Towns Marty 1 Free Software Collection.iso / game / ysmaze / 3dmaze.c next >
Text File  |  1993-11-11  |  6KB  |  285 lines

  1. #include <stdio.h>
  2. #include <egb.h>
  3. #include <mos.h>
  4. #include <snd.h>
  5. #include <ys-11c.h>
  6. #include <ysutyc.h>
  7. #include <ysmaze.h>
  8.  
  9. #define MX        32
  10. #define MY        24
  11.  
  12. char EGB_work[EgbWorkSize];
  13. char MOS_work[MosWorkSize];
  14. char SND_work[16*1024];
  15. struct menuStyle mn={3,3, 2,2, 3, 8,16};
  16. struct fontSize fnt={8,16};
  17.  
  18.  
  19. int loadMaze(char *fname,struct mazeStyle *mz,short *dat)
  20. {
  21.     int fl;
  22.     FILE *fp;
  23.  
  24.     fp=fopen(fname,"rb");
  25.     if(fp==NULL)return -1;
  26.     fl=YSC_fsize(fp)-16;
  27.     fread(&(*mz).bl,4,1,fp);
  28.     fread(&(*mz).bh,4,1,fp);
  29.     fread(&(*mz).lx,4,1,fp);
  30.     fread(&(*mz).ly,4,1,fp);
  31.     fread(dat,1,fl,fp);
  32.     fclose(fp);
  33.     return 0;
  34. }
  35.  
  36.  
  37.  
  38. void turn(int *dir,int ofset)
  39. {
  40.     *dir=(*dir+ofset)&65535;
  41. }
  42.  
  43. void progress(struct mazeStyle *mz,short *dat,int *x,int *y,int dir,int v)
  44. {
  45.     int vx,vy;
  46.     int lx=(*mz).bl * (*mz).lx;
  47.     int ly=(*mz).bl * (*mz).ly;
  48.     int x2,y2,bx,by,bx2,by2;
  49.  
  50.     vx=-YCC_sin(v,dir);
  51.     vy=-YCC_cos(v,dir);
  52.  
  53.     bx=(*x/(*mz).bl);
  54.     by=(*y/(*mz).bl);
  55.  
  56.     x2= *x+vx;
  57.     while(x2<  0)x2+=lx;
  58.     while(x2>=lx)x2-=lx;
  59.     bx2= x2/(*mz).bl;
  60.     if     (vx>0 && bx2!=bx && YSC_mazePass(mz,dat,bx,by,3))return;
  61.     else if(vx<0 && bx2!=bx && YSC_mazePass(mz,dat,bx,by,1))return;
  62.     else bx=bx2;
  63.  
  64.     y2= *y+vy;
  65.     while(y2<  0)y2+=ly;
  66.     while(y2>=ly)y2-=ly;
  67.     by2= y2/(*mz).bl;
  68.     if     (vy>0 && by2!=by && YSC_mazePass(mz,dat,bx,by,2))return;
  69.     else if(vy<0 && by2!=by && YSC_mazePass(mz,dat,bx,by,0))return;
  70.  
  71.     *x=x2;
  72.     *y=y2;
  73. }
  74.  
  75.  
  76. void radar(struct mazeStyle *mz,
  77.      int sx,int sy,int c1,int px,int py,int c2,int mx,int my,int l)
  78. {
  79.     int bl=(*mz).bl;
  80.  
  81.     px/=bl; py/=bl; mx/=bl; my/=bl;
  82.  
  83.     if(c1==c2 && px==mx && py==my)return;
  84.  
  85.     YGB_color(EGB_work,31);
  86.     YGB_writeMode(EGB_work,XOR);
  87.     px=sx+px*l; py=sy+py*l; mx=sx+mx*l; my=sy+my*l;
  88.     if(c1)YGB_boxFul(EGB_work,px,py,px+l-2,py+l-2);
  89.     if(c2)YGB_boxFul(EGB_work,mx,my,mx+l-2,my+l-2);
  90. }
  91.  
  92.  
  93. void playGame(struct mazeScreen *ms,struct mazeStyle *mz,short *dat)
  94. {
  95.     int fin=0;
  96.     int px,py,mx,my,dir,pad;
  97.     int buf[640*9];
  98.     int rx0,ry0,rx1,ry1,rl;
  99.  
  100.     mx=(*mz).bl /2;
  101.     my=(*mz).bl /2;
  102.     dir=49152;
  103.  
  104.     rl=((*ms).y1 -(*ms).y0)/(*mz).ly;
  105.     rx0=(*ms).x1+1;
  106.     ry0=(*ms).y0;
  107.     rx1=rx0+rl*(*mz).lx+1;
  108.     ry1=ry0+rl*(*mz).ly;
  109.  
  110.     YGB_cls(EGB_work);
  111.     YGB_color(EGB_work,0);
  112.     YGB_boxFul(EGB_work,rx0+1,ry0+1,rx1-1,ry1-1);
  113.     YGB_color(EGB_work,32767);
  114.     YGB_print(EGB_work,10,150,"PAD  ↑↓←→: MOVE");
  115.     YGB_print(EGB_work,10,166,"     A       : GIVE UP");
  116.     YGB_box(EGB_work,rx0,ry0,rx1,ry1);
  117.     YGB_line(EGB_work,rx1,ry1,rx1-rl,ry1-rl);
  118.     YGB_line(EGB_work,rx1,ry1-rl,rx1-rl,ry1);
  119.  
  120.     radar(mz,rx0+1,ry0+1,0,0,0,1,mx,my,rl);
  121.     while(fin==0)
  122.     {
  123.         YSC_mazeGetLines(mz,ms,dat,mx,my,dir,1500,buf);
  124.         YSC_mazeDrawWalls(EGB_work,mz,ms,buf);
  125.  
  126.         pad=255;
  127.         while(pad!=255)SND_joy_in_2(0,&pad);
  128.         while(pad==255)SND_joy_in_2(0,&pad);
  129.  
  130.         if(!(pad & 16))fin=1;
  131.  
  132.         px=mx; py=my;
  133.         if(!(pad & 1))progress(mz,dat,&mx,&my,dir, (*mz).bl/5);
  134.         if(!(pad & 2))progress(mz,dat,&mx,&my,dir,-(*mz).bl/5);
  135.         if(!(pad & 4))turn(&dir, 2048);
  136.         if(!(pad & 8))turn(&dir,-2048);
  137.         radar(mz,rx0+1,ry0+1,1,px,py,1,mx,my,rl);
  138.  
  139.         if(mx/(*mz).bl==(*mz).lx-1  &&  my/(*mz).bl==(*mz).ly-1)fin=2;
  140.     }
  141.  
  142.     switch(fin)
  143.     {
  144.     case 1:
  145.         YSC_dispWalls
  146.             (EGB_work,mz,rx0+1,ry0+1,dat,0,0,(*mz).lx-1,(*mz).ly-1,rl);
  147.         YSC_waitMessage(EGB_work,"Give Up!(^_^)",100,10,10,&fnt);
  148.         break;
  149.     case 2:
  150.         YSC_waitMessage(EGB_work,"Congratulations!!",100,10,10,&fnt);
  151.         break;
  152.     }
  153. }
  154.  
  155.  
  156. void egbset(int smod)
  157. {
  158.     int resx,resy,mlt;
  159.  
  160.     switch(smod)
  161.     {
  162.     case 3:
  163.     case 12:
  164.         resx=640;
  165.         resy=480;
  166.         mlt=1;
  167.         break;
  168.     case 10:
  169.         resx=320;
  170.         resy=240;
  171.         mlt=2;
  172.         break;
  173.     }
  174.  
  175.     EGB_init(EGB_work,EgbWorkSize);
  176.     EGB_resolution(EGB_work,0,smod);
  177.     EGB_resolution(EGB_work,1,smod);
  178.     EGB_displayPage(EGB_work,0,3);
  179.     EGB_writePage(EGB_work,0);
  180.     EGB_displayStart(EGB_work,0,0,0);
  181.     EGB_displayStart(EGB_work,2,mlt,mlt);
  182.     EGB_displayStart(EGB_work,3,resx,resy);
  183.     EGB_color(EGB_work,1,32768);
  184.     EGB_partClearScreen(EGB_work);
  185.     EGB_writePage(EGB_work,1);
  186.     EGB_displayStart(EGB_work,0,0,0);
  187.     EGB_displayStart(EGB_work,2,mlt,mlt);
  188.     EGB_displayStart(EGB_work,3,resx,resy);
  189.     EGB_color(EGB_work,1,32768);
  190.     EGB_partClearScreen(EGB_work);
  191.     EGB_mask(EGB_work,0);
  192. }
  193.  
  194.  
  195.  
  196. void main(int argc,char *argv[])
  197. {
  198.     int smod=10;
  199.     int fin=0,lf=0,sel;
  200.     char *intro[]={"☆☆☆ 3次元迷路 ☆☆☆   by YS-11",
  201.                    "このプログラムはパッドのみで操作し",
  202.                    "ます。一番左上からスタートしますの",
  203.                    "で、一番右下に辿り着いてください。",};
  204.     char *menu[]={"ゲーム","終了","画面モード"};
  205.     short dat[ MX*MY+1 ];
  206.     struct mazeStyle mz;
  207.     struct mazeScreen ms={80,60, 0,0,160,120,
  208.                           24*1024+24*32+24,10*1024+10*32+10,
  209.                           5, 64};
  210.  
  211.     mz.bl=500;
  212.     mz.bh=500;
  213.     mz.lx=24;
  214.     mz.ly=24;
  215.  
  216.     if(argc>=2)
  217.     {
  218.         lf=1;
  219.         if(loadMaze(argv[1],&mz,dat))
  220.         {
  221.             printf("Load Error\n");
  222.             exit(-1);
  223.         }
  224.     }
  225.  
  226.     egbset(smod);
  227.  
  228.     SND_init(SND_work);
  229.  
  230.     MOS_start(MOS_work,MosWorkSize);
  231.     MOS_resolution(0,smod);
  232.     MOS_resolution(1,smod);
  233.     MOS_color(1,0x7fffffff);
  234.     MOS_writePage(0);
  235.     MOS_horizon(0,319);
  236.     MOS_vertical(0,239);
  237.     MOS_setpos(128,120);
  238.     MOS_disp(0);
  239.  
  240.     YSC_waitInformation(EGB_work,intro,4,30,30,&fnt);
  241.  
  242.     while(fin==0)
  243.     {
  244.         char *stack;
  245.  
  246.         if(lf==0)
  247.         {
  248.             int i;
  249.             for(i=0; i<(mz.lx)*(mz.ly); i++)dat[i]=0;
  250.             YSC_mazeCreate(&mz,dat);
  251.             YGB_cls(EGB_work);
  252.         }
  253.         dat[(mz.ly)*(mz.lx)-1] |= 64;
  254.  
  255.         YSC_dispWalls(EGB_work,&mz,0,0,dat,0,0,mz.lx-1,mz.ly-1,9);
  256.         stack=YSC_pushMenuArea(EGB_work,&mn,220,10,3,menu);
  257.         sel=YSC_waitMenu(EGB_work,&mn,220,10,3,menu);
  258.         YSC_popScreenBlock(EGB_work,stack);
  259.  
  260.         switch(sel)
  261.         {
  262.         case 1:
  263.             YGB_cls(EGB_work);
  264.             playGame(&ms,&mz,dat);
  265.             break;
  266.         case 2:
  267.             fin=1;
  268.             break;
  269.         case 3:
  270.             if     (smod== 3)smod=12;
  271.             else if(smod==12)smod=10;
  272.             else if(smod==10)smod= 3;
  273.             egbset(smod);
  274.             MOS_resolution(0,smod);
  275.             MOS_resolution(1,smod);
  276.             MOS_color(1,0x7fffffff);
  277.             break;
  278.         }
  279.     }
  280.  
  281.     MOS_end();
  282.     SND_end();
  283. }
  284.  
  285.